#include "BitHandlerInput.h"

//todos mis algoritmos se basan en q vamos a leer y a escribir los bloques tratandolos como si fueran texto...

//luego d la construccion, el objeto ya esta en condiciones d entregar bits
//desde la posicion q se le ha pasado por parametro...

BitHandlerInput::BitHandlerInput(const char* fileName, int pos) {
	//cout << "constructor BitHandlerInput" << endl;
    archEntrada.open(fileName,ios_base::in|ios::binary);
	archEntrada.seekg(pos);
	indexBitset = 7;
	eofv=false;
	leerSiguienteChar();

	//cout << "fin BitHandlerInput" << endl;

}

BitHandlerInput::~BitHandlerInput() {
	archEntrada.close();
}

//posiciona y lee el char correspondiente a esa posicion -> listo para entregar bits
void BitHandlerInput::seek(int pos) {
	archEntrada.seekg(pos);
	leerSiguienteChar();

}

bool BitHandlerInput::siguienteBitEsUno() {

	bool retorno = bitSet[indexBitset];
	indexBitset--;

	if (indexBitset < 0) {
		 leerSiguienteChar();
		 indexBitset = 7;
	}
	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	//C++ TOMA:
	//0 = FALSE
	//1 = TRUE
	// SI ESO NO GUSTA, SIMPLEMENTE DEVOLVEMOS !retorno (LO INVIERTE)
	// OJO Q SI INVERTIMOS LOS VALORES ACA, HABRA Q INVERTIR TAMBIEN LAS ACCIONES DEL IF EN DONDE SE PREGUNTE EL VALOR
	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	return retorno;
}

void BitHandlerInput::leerSiguienteChar() {
    if (!archEntrada.eof())	bitSet = archEntrada.get();

}

bool BitHandlerInput::eof() {
	return !archEntrada.good();
}

// de prueba
char BitHandlerInput::getCharActual() {
	char charActual = (int)bitSet.to_ulong();
	return charActual;
}

void BitHandlerInput::setEof()
{
    this->eofv=true;
}

void BitHandlerInput::resetEof()
{
    this->eofv=false;
}

bool BitHandlerInput::eofVirtual()
{
    return this->eofv;
}
